# Copyright Vladimir Prus 2004.
# Copyright Toon Knapen 2004.
# Copyright Boris Gubenko 2007.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE.txt
# or copy at https://www.bfgroup.xyz/b2/LICENSE.txt)

#| tag::doc[]

[[bbv2.reference.tools.compiler.acc]]
= HP aC++ compiler

The `acc` module supports the
http://h21007.www2.hp.com/dspp/tech/tech_TechSoftwareDetailPage_IDX/1,1703,1740,00.html[HP
aC++ compiler] for the HP-UX operating system.

The module is initialized using the following syntax:

----
using acc : [version] : [c++-compile-command] : [compiler options] ;
----

This statement may be repeated several times, if you want to configure
several versions of the compiler.

If the command is not specified, the `aCC` binary will be searched in
PATH.


The following options can be provided, using
_`<option-name>option-value syntax`_:

`cflags`::
Specifies additional compiler flags that will be used when compiling C
sources.

`cxxflags`::
Specifies additional compiler flags that will be used when compiling C++
sources.

`compileflags`::
Specifies additional compiler flags that will be used when compiling both C
and C++ sources.

`linkflags`::
Specifies additional command line options that will be passed to the linker.

|# # end::doc[]

#
# B2 V2 toolset for the HP aC++ compiler.
#

import toolset : flags ;
import feature ;
import generators ;
import common ;

feature.extend toolset : acc ;
toolset.inherit acc : unix ;
generators.override builtin.lib-generator : acc.prebuilt ;
generators.override acc.searched-lib-generator : searched-lib-generator ;

# Configures the acc toolset.
rule init ( version ? : user-provided-command * : options * )
{
    local condition = [ common.check-init-parameters acc
        : version $(version) ] ;

    local command = [ common.get-invocation-command acc : aCC
        : $(user-provided-command) ] ;

    common.handle-options acc : $(condition) : $(command) : $(options) ;
}


# Declare generators
generators.register-c-compiler acc.compile.c : C : OBJ : <toolset>acc ;
generators.register-c-compiler acc.compile.c++ : CPP : OBJ : <toolset>acc ;

# Declare flags.
flags acc CFLAGS <optimization>off : ;
flags acc CFLAGS <optimization>speed : -O3 ;
flags acc CFLAGS <optimization>space : -O2 ;

flags acc CFLAGS <inlining>off : +d ;
flags acc CFLAGS <inlining>on : ;
flags acc CFLAGS <inlining>full : ;

flags acc C++FLAGS <exception-handling>off : ;
flags acc C++FLAGS <exception-handling>on : ;

flags acc C++FLAGS <rtti>off : ;
flags acc C++FLAGS <rtti>on : ;

# We want the full path to the sources in the debug symbols because otherwise
# the debugger won't find the sources when we use boost.build.
flags acc CFLAGS <debug-symbols>on : -g ;
flags acc LINKFLAGS <debug-symbols>on : -g ;
flags acc LINKFLAGS <debug-symbols>off : -s ;

# V2 does not have <shared-linkable>, not sure what this meant in V1.
# flags acc CFLAGS <shared-linkable>true : +Z ;

flags acc CFLAGS <profiling>on : -pg ;
flags acc LINKFLAGS <profiling>on : -pg ;

flags acc CFLAGS <address-model>64 : +DD64 ;
flags acc LINKFLAGS <address-model>64 : +DD64 ;

# It is unknown if there's separate option for rpath used only
# at link time, similar to -rpath-link in GNU. We'll use -L.
flags acc RPATH_LINK : <xdll-path> ;

flags acc CFLAGS <cflags> ;
flags acc C++FLAGS <cxxflags> ;
flags acc DEFINES <define> ;
flags acc UNDEFS <undef> ;
flags acc HDRS <include> ;
flags acc STDHDRS <sysinclude> ;
flags acc LINKFLAGS <linkflags> ;
flags acc ARFLAGS <arflags> ;

flags acc LIBPATH <library-path> ;
flags acc NEEDLIBS <library-file> ;
flags acc FINDLIBS <find-shared-library> ;
flags acc FINDLIBS <find-static-library> ;

# Select the compiler name according to the threading model.
flags acc CFLAGS <threading>multi : -mt   ;
flags acc LINKFLAGS <threading>multi : -mt ;

flags acc.compile.c++ TEMPLATE_DEPTH <c++-template-depth> ;


actions acc.link bind NEEDLIBS
{
    $(CONFIG_COMMAND) -AA $(LINKFLAGS) -o "$(<[1])" -L"$(RPATH_LINK)" -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) $(OPTIONS)
}

SPACE = " " ;
actions acc.link.dll bind NEEDLIBS
{
    $(CONFIG_COMMAND) -AA -b $(LINKFLAGS) -o "$(<[1])" -L"$(RPATH_LINK)" -Wl,+h$(<[-1]:D=) -L$(LIBPATH) -L$(STDLIBPATH) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) $(OPTIONS)
}

actions acc.compile.c
{
    cc -c -I$(BOOST_ROOT) -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) -I"$(HDRS)" -I"$(STDHDRS)" -o "$(<)" "$(>)" $(OPTIONS)
}

actions acc.compile.c++
{
    $(CONFIG_COMMAND) -AA -c -Wc,--pending_instantiations=$(TEMPLATE_DEPTH) -I$(BOOST_ROOT) -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) $(C++FLAGS) -I"$(HDRS)" -I"$(STDHDRS)" -o "$(<)" "$(>)" $(OPTIONS)
}

actions updated together piecemeal acc.archive
{
    ar ru$(ARFLAGS:E="") "$(<)" "$(>)"
}
